﻿#define _CRT_SECURE_NO_WARNINGS
//作者：爱吃糖的boy
#include<stdio.h>

////⼆级指针
//int main() 
//{
//	int a = 100;
//	int* p = &a;  //p是指针变量 ，一级指针
//	&p;  //指针变量也是变量
//	int* *  pp = &p;  //pp二级指针  :存放一级指针变量的地址
//	int** * ppp = &pp;//ppp三级指针
//	//...
//	printf("%d\n",**pp);
//	return 0;
//}

////指针数组:是存放指针的数组。
////数组中的每个元素是指针
//int main() 
//{
//	int arr1[2];//整型数组
//	char arr12[2];//字符数组
//	int* arr[4]; //指针数组
//	return 0;
//}

////指针数组模拟⼆维数组
//int main() 
//{
//	int arr1[] = {1,2,3,4,5};
//	int arr2[] = {2,3,4,6,8};
//	int arr3[] = {5,2,5,7,5};
//	int* arr4[3] = {arr1,arr2,arr3}; //指针数组
//	for (int i = 0; i < 3; i++)
//	{
//		for (int j = 0;j<5;j++) 
//		{
//			printf("%d ",arr4[i][j]); 
//		}
//		printf("\n");
//	}
//	return 0;
//}

////字符指针变量
//int main() 
//{
//	char ch = 'w';
//	char* pc = &ch;  //pc 是字符指针
//
//	const char* p = "abcdef";  //不是把字符串存放在p中，而是把第一个字符的地址存放在p中 
//	//常量字符串
//	//字符串可以看作字符数组
//	printf("%c\n",*p);
//	printf("%c\n",p[3]);
//	printf("%c\n","abcdef"[2]);
//
//	return 0;
//}

//int main()
//{
//	char str1[] = "hello bit.";
//	char str2[] = "hello bit.";
//	const char* str3 = "hello bit.";   //0x00007ff6f82c9d78
//	const char* str4 = "hello bit.";  // 0x00007ff6f82c9d78
//	if (str1 == str2)  //比较的是地址
//		printf("str1 and str2 are same\n");
//	else
//		printf("str1 and str2 are not same\n");
//
//	if (str3 == str4)  //比较的是地址
//		printf("str3 and str4 are same\n");
//	else
//		printf("str3 and str4 are not same\n");
//
//	return 0;
//}

//数组指针变量:存放的应该是数组的地址，能够指向数组的指针变量。
//int main()
//{
//	int* p1[10];  //指针数组：数组10个元素，元素的类型是int*
//	int(*p2)[10];  //数组指针：数组有10个元素，元素的类型是int
//	//指向数组的指针
//
//	int arr1[] = { 1,2,3,4,5 };
//	int* p = arr1;
//	int* p1 = &arr1[0];
//
//	int(*parr)[5] = &arr1;//取出数组的指针
//	//类型：int(*)[]
//	return 0;
//}

//int main()
//{
//	int arr[] = { 1,2,3,4,5 ,6,7,8,9,10};
//	
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//int* p = arr;
//	//for (int i = 0; i < sz; i++)
//	//{
//	//	printf("%d ", * (p+i));
//	//}
//
//	int(*p)[10] = &arr;
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", (*p)[i]);
//	}
//	//p== &arr
//	//*p == *&arr == arr
//	//*p == arr
//	return 0;
//
//}

//⼆维数组传参的本质
//void test(int a[3][5], int r, int c) 
//{
//
//	for (int i = 0; i < r; i++)
//	{
//		for (int j= 0;j<c;j++) 
//		{
//			printf("%d ", a[i][j]);
//		}
//		printf("\n");
//	}
//}

//void test(int(*a)[5], int r, int c)
//{
//
//	for (int i = 0; i < r; i++)
//	{
//		for (int j = 0; j < c; j++)
//		{
//			printf("%d ", *(*(a+i)+j));
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//
//	int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };
//	test(arr, 3, 5); //数组名是首元素的地址
//	//二维数组其实是一维数组的数组
//	return 0;
//
//}
////总结：⼆维数组传参，形参的部分可以写成数组，也可以写成指针形式

////输入一个整数数组，实现一个函数，
////
////来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分，
////
////所有偶数位于数组的后半部分。
//
//void Swag(int str[], int len)
//{
//	int i, j;
//	for (i = 0; i < len; i++)
//	{
//		if ((str[i] % 2) == 0)
//			for (j = i + 1; j < len; j++)
//			{
//				int temp;
//				if ((str[j] % 2) == 1)
//				{
//					temp = str[i];
//					str[i] = str[j];
//					str[j] = temp;
//					break;
//				}
//			}
//	}
//}
//
//
//int main()
//{
//	int arr[] = { 1, 2, 3, 4, 5 };
//	int i, j;
//	Swag(arr, sizeof(arr) / sizeof(arr[0]));
//	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}

//函数指针变量:函数指针变量应该是⽤来存放函数地址的，未来通过地址能够调⽤函数的。
//void test()
//{
//	printf("hehe\n");
//}
//int main()
//{
//	printf("test: %p\n", test);
//	printf("&test: %p\n", &test);
//
//	//函数名和&函数名都是函数的地址
//
//	void (*pf)()= &test;
//	(*pf)();  //地址调用
//	pf();  ////地址调用
//	//pf == test == &test
//	return 0;
//}

//void test()
//{
//	printf("hehe\n");
//}
////void (*pf1)() = &test;
////void (*pf2)() = test;
//int Add(int x, int y)
//{
//	return x + y;
//}
////int(*pf3)(int, int) = Add;
////int(*pf3)(int x, int y) = &Add;//x和y写上或者省略都是可以的

////函数指针变量的使⽤
//int Add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	int(*pf3)(int, int) = Add;
//
//	printf("%d\n", (*pf3)(2, 3));
//	printf("%d\n", pf3(3, 5));
//	return 0;
//}

//typedef关键字
//typedef 是⽤来类型重命名的，可以将复杂的类型，简单化。
typedef unsigned int uint;
//将unsigned int 重命名为uint
typedef int(*parr_t)[5]; //新的类型名必须在*的右边
typedef void(*pfun_t)(int);//新的类型名必须在*的右边
typedef void(*pfun_t)(int);

int main()
{
	uint num;
	unsigned int num1;

	parr_t pa;
	int(*pb)[5];
	pfun_t signal(int, pfun_t);
	printf("11-21打卡完毕！");

	return 0;

}